// import { rsaEncrypt } from '@/utils/jsencrypt'
// import { checkPwd } from '@/api'
/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
  }
  
  /**
   * @param {string} str
   * @returns {Boolean}
   */
  export function validUsername(str) {
    const valid_map = ['admin', 'editor']
    return valid_map.indexOf(str.trim()) >= 0
  }
  
  /**
   * @param {string} url
   * @returns {Boolean}
   */
  export function validURL(url) {
    const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
    return reg.test(url)
  }
  
  /**
   * @param {string} str
   * @returns {Boolean}
   */
  export function validLowerCase(str) {
    const reg = /^[a-z]+$/
    return reg.test(str)
  }
  
  /**
   * @param {string} str
   * @returns {Boolean}
   */
  export function validUpperCase(str) {
    const reg = /^[A-Z]+$/
    return reg.test(str)
  }
  
  /**
   * @param {string} str
   * @returns {Boolean}
   */
  export function validAlphabets(str) {
    const reg = /^[A-Za-z]+$/
    return reg.test(str)
  }
  
  /**
   * @param {string} email
   * @returns {Boolean}
   */
  export function validEmail(email) {
    const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return reg.test(email)
  }
  
  /**
   * @param {string} str
   * @returns {Boolean}
   */
  export function isString(str) {
    if (typeof str === 'string' || str instanceof String) {
      return true
    }
    return false
  }
  
  /**
   * @param {Array} arg
   * @returns {Boolean}
   */
  export function isArray(arg) {
    if (typeof Array.isArray === 'undefined') {
      return Object.prototype.toString.call(arg) === '[object Array]'
    }
    return Array.isArray(arg)
  }
  
  /*******************************新增*******start******************************** */
  
  export function isvalidUsername(str) {
    const valid_map = ['admin', 'editor']
    return valid_map.indexOf(str.trim()) >= 0
  }
  
  /* 合法uri*/
  export function validateURL(textval) {
    const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
    return urlregex.test(textval)
  }
  /**
   * 邮箱
   * @param {*} s
   */
  export function isEmail(s) {
    return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
  }
  
  /**
   * 手机号码
   * @param {*} s
   */
  export function isMobile(s) {
    return /^0?(13|14|15|16|17|18|19)[0-9]{9}$/.test(s)
  }
  
  /**
   * 电话号码
   * @param {*} s
   */
  export function isPhone(s) {
    return /^([0-9]{3,4})?[0-9]{7,8}$/.test(s)
  }
  
  /**
   * 车牌号
   * @param {*} s
   */
  export function isLicenseplatenumber(s) {
    return /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1})$/.test(s)
  }
  
  /**
   * URL地址
   * @param {*} s
   */
  export function isURL(s) {
    return /^http[s]?:\/\/.*/.test(s)
  }
  
  /* 小写字母*/
  export function validateLowerCase(str) {
    const reg = /^[a-z]+$/
    return reg.test(str)
  }
  
  /* 大写字母*/
  export function validateUpperCase(str) {
    const reg = /^[A-Z]+$/
    return reg.test(str)
  }
  
  /* 大小写字母*/
  export function validatAlphabets(str) {
    const reg = /^[A-Za-z]+$/
    return reg.test(str)
  }
  /*验证pad还是pc*/
  export const vaildatePc = function () {
    const userAgentInfo = navigator.userAgent
    const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']
    let flag = true
    for (var v = 0; v < Agents.length; v++) {
      if (userAgentInfo.indexOf(Agents[v]) > 0) {
        flag = false
        break
      }
    }
    return flag
  }
  /**
   * validate email
   * @param email
   * @returns {boolean}
   */
  export function validateEmail(email) {
    const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return re.test(email)
  }
  
  /**
   * 判断身份证号码
   */
  export function cardid(code) {
    let list = []
    let result = true
    let msg = ''
    var city = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江 ',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北 ',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏 ',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门',
      91: '国外 ',
    }
    if (!validatenull(code)) {
      if (code.length == 18) {
        if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
          msg = '证件号码格式错误'
        } else if (!city[code.substr(0, 2)]) {
          msg = '地址编码错误'
        } else {
          //18位身份证需要验证最后一位校验位
          code = code.split('')
          //∑(ai×Wi)(mod 11)
          //加权因子
          var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
          //校验位
          var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x']
          var sum = 0
          var ai = 0
          var wi = 0
          for (var i = 0; i < 17; i++) {
            ai = code[i]
            wi = factor[i]
            sum += ai * wi
          }
          if (code[17] == 'x') {
            code[17] = code[17].toUpperCase()
          }
          if (parity[sum % 11] != code[17]) {
            msg = '证件号码校验位错误'
          } else {
            result = false
          }
        }
      } else {
        msg = '证件号码长度不为18位'
      }
    } else {
      msg = '证件号码不能为空'
    }
    list.push(result)
    list.push(msg)
    return list
  }
  /**
   * 判断手机号码是否正确
   */
  export function isvalidatemobile(phone) {
    let list = []
    let result = true
    let msg = ''
    let isPhone = /^0\d{2,3}-?\d{7,8}$/
    //增加134 减少|1349[0-9]{7}，增加181,增加145，增加17[678]
    if (!validatenull(phone)) {
      if (phone.length == 11) {
        if (isPhone.test(phone)) {
          msg = '手机号码格式不正确'
        } else {
          result = false
        }
      } else {
        msg = '手机号码长度不为11位'
      }
    } else {
      msg = '手机号码不能为空'
    }
    list.push(result)
    list.push(msg)
    return list
  }
  /**
   * 判断中文姓名是否正确
   */
  export function validatename(name) {
    var regName = /^[\u4e00-\u9fa5]{2,4}$/
    if (!regName.test(name)) return false
    return true
  }
  /**
   * 判断姓名是否正确（包括中英文）(英文可匹配 TAN AI NEE 、Tan Ae)
   */
  export function validatenames(name) {
    var regName = /^[\u4e00-\u9fa5]{2,4}$/
    var EngName = /^([A-Za-z]+\s)+[A-Za-z]+$/
    var EngName2 = /^[A-Za-z]+$/
    if (!regName.test(name) && !EngName.test(name) && !EngName2.test(name)) return false
    return true
  }
  /**
   * 判断是否为整数
   */
  export function validatenum(num, type) {
    let regName = /[^\d.]/g
    if (type == 1) {
      if (!regName.test(num)) return false
    } else if (type == 2) {
      regName = /[^\d]/g
      if (!regName.test(num)) return false
    }
    return true
  }
  /**
   * 判断是否为小数
   */
  export function validatenumord(num, type) {
    let regName = /[^\d.]/g
    if (type == 1) {
      if (!regName.test(num)) return false
    } else if (type == 2) {
      regName = /[^\d.]/g
      if (!regName.test(num)) return false
    }
    return true
  }
  /**
   * 判断是否为空
   */
  export function validatenull(val) {
    if (typeof val == 'boolean') {
      return false
    }
    if (typeof val == 'number') {
      return false
    }
    if (val instanceof Array) {
      if (val.length == 0) return true
    } else if (val instanceof Object) {
      if (JSON.stringify(val) === '{}') return true
    } else {
      if (val == 'null' || val == null || val == 'undefined' || val == undefined || val == '') return true
      return false
    }
    return false
  }
  /**
 * 判断是否有中文
 */
    export function validatechinese(val) {
        let regName = /[\u4e00-\u9fa5]/;
        if (regName.test(val)) return true;
        return false;
    }

/**
 * 判断是否字符串是否是base64
 */
    export function base64Pattern(val) {
        let regName = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/;
        if (regName.test(val)) return true;
    return false;
    }


  //结合表单avue验证手机号信息
  export function v_phone(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入正确的手机号'))
      } else {
        callback()
      }
    } else {
      if (!isMobile(value)) {
        callback(new Error('手机号码格式不正确'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证中文姓名信息
  export function v_name(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入中文姓名'))
      } else {
        callback()
      }
    } else {
      if (!validatename(value)) {
        callback(new Error('姓名格式不正确'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证中英文姓名信息
  export function v_names(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入姓名'))
      } else {
        callback()
      }
    } else {
      if (!validatenames(value)) {
        callback(new Error('请输入正确的姓名格式。中文(允许2-4个文字)：张三；英文(多个单词需要空格连接)：Jane、Jane Han; 注意：输入数字无效。'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证邮箱信息
  export function v_email(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入正确的邮箱'))
      } else {
        callback()
      }
    } else {
      let new_rec = validateEmail(value)
      if (!new_rec) {
        callback(new Error('请输入正确的邮箱'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证身份证信息
  export function v_cardid(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入正确的身份证'))
      } else {
        callback()
      }
    } else {
      let new_rec = cardid(value)
      if (new_rec[0]) {
        callback(new Error(new_rec[1]))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证身份证信息 实时查询数据库的验证
  let timeout_cardid_repeat = null
  export function v_cardid_repeat(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入正确的身份证'))
      } else {
        callback()
      }
    } else {
      let new_rec = cardid(value)
      if (new_rec[0]) {
        callback(new Error(new_rec[1]))
      } else {
        // callback()
        if (timeout_cardid_repeat != null) {
          clearTimeout(timeout_cardid_repeat)
        }
        timeout_cardid_repeat = setTimeout(() => {
          // getCarIdAndPhone({ cardId: value }).then(
          //   (res) => {
          //     if (res.data) {
          //       callback()
          //     } else {
          //       callback(new Error('身份证号系统已存在,请修改'))
          //     }
          //   },
          //   (error) => {
          //     callback(new Error('身份证号系统已存在,请修改'))
          //   }
          // )
        }, 1000)
      }
    }
  }
  
  //结合表单avue验证 固定电话+手机号+国际电话 信息
  export function v_telephone(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入固话或手机号'))
      } else {
        callback()
      }
    } else {
      if (!isPhone(value) && !isMobile(value)) {
        callback(new Error('请输入正确的固话或手机号'))
      } else {
        callback()
      }
    }
  }
  
  // 车牌号验证 License plate number
  export function v_licenseplatenumber(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入车牌号'))
      } else {
        callback()
      }
    } else {
      if (!isLicenseplatenumber(value) && !isLicenseplatenumber(value)) {
        callback(new Error('请输入正确的车牌号,譬如:桂C12345'))
      } else {
        callback()
      }
    }
  }
  
  function debounce(func, wait = 1000) {
    return function (event) {
      clearTimeout(timeout)
      timeout = setTimeout(() => {
        func.call(this, event)
      }, wait)
    }
  }
  
  //全局密码效验规则
  let timeout_pwd = null
  export function v_st_password(rule, value, callback) {
    // let regLoserLetter = /^.*[a-z]{1,}.*$/; //包含小写字母
    // let regUpperLetter = /^.*[A-Z]{1,}.*$/; //包含大写字母
    // let regSpecialLetter = /^.*[^a-zA-Z0-9]{1,}.*$/; //包含特殊字符
    // let regNum = /^.*[0-9]{1,}.*$/; //包含数字
  
    // let reg = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{8,30}$/
  
    // if (value === "") {
    //   callback(new Error('请输入密码'));
    // } else if (value.length > 16 || value.length < 8) {
    //   callback(new Error('密码长度8至16位，至少包括数字、小写字母、大写字母和特殊符号中的三种'))
    // } else {
    //   //if (!(regLoserLetter.test(value) & regUpperLetter.test(value) & regSpecialLetter.test(value) & regNum.test(value))) {
    //   if (!(reg.test(value))) {
    //     callback(new Error('密码长度8至16位，至少包括数字、小写字母、大写字母和特殊符号中的三种'));
    //   }
    //   else {
    //     callback();
    //   }
    // }
  
    //调用方法验证密码
    if (value === '' && rule.required) {
      callback(new Error('请输入密码'))
    } else if (value === '' && !rule.required) {
      callback()
    } else {
      if (timeout_pwd != null) {
        clearTimeout(timeout_pwd)
      }
      timeout_pwd = setTimeout(() => {
        checkPwd({ pwd: rsaEncrypt(value) }).then((res) => {
          const data = res.data.data
          if (data) {
            if (data.isPass) {
              callback()
            } else {
              callback(new Error(data.msg))
            }
          } else {
            callback(new Error('验证失败,请重新输入'))
          }
        })
      }, 1000)
    }
  }
  
  //结合表单avue验证 6位整数密码
  export function v_six_password(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入6位数字密码'))
      } else {
        callback()
      }
    } else {
      let reg = /^\d{6}$/
      if (!reg.test(value)) {
        callback(new Error('请输入6位数字密码'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证 整数
  export function v_integer(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入整数'))
      } else {
        callback()
      }
    } else {
      let reg = /^\d{6}$/
      if (validatenum(value, 2)) {
        callback(new Error('请输入整数'))
      } else {
        callback()
      }
    }
  }
  
  //结合表单avue验证 IP
  export function v_ip(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入IP'))
      } else {
        callback()
      }
    } else {
      let reg = /^([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}/
      if (!reg.test(value)) {
        callback(new Error('请输入正确的IP'))
      } else {
        callback()
      }
    }
  }
  //结合表单avue验证 合法URL
  export function v_url(rule, value, callback) {
    if (value === '') {
      if (rule.required) {
        callback(new Error('请输入URL'))
      } else {
        callback()
      }
    } else {
      if (!validateURL(value)) {
        callback(new Error('请输入正确的URL'))
      } else {
        callback()
      }
    }
  }
  
  /**
   * 对对象进行非空验证
   * @param {*} obj
   * @param {*} field
   * @returns
   */
  export function validateFormEmpty(obj, field) {
    const keys = Object.keys(field)
    const result = []
    for (const key of keys) {
      if (!obj[key]) {
        result.push(field[key])
      }
    }
    if (result.length) {
      return result
    }
  }
  
  // 校验数据长度
  export function driverNameLength(rule, value, callback) {
    if (value === '') {
      // 如果是必填
      if (rule.required) {
        callback(new Error('可手动输入司机姓名或点后面搜索进行添加'))
      } else {
        callback()
      }
    } else {
      if (value.length < 2) {
        callback(new Error('司机姓名长度必须大于2'))
      } else {
        callback()
      }
    }
  }
  
  export function customValidate(rules, obj) {
    // const keys = Object.keys(rules)
  
    // const result = []
  
    // for (const key of keys) {
    //   // 验证必填
    //   if (rules[key].required) {
    //     if (!obj[key]) {
    //       result.push(rules[key].msg)
    //       continue
    //     }
    //   }
  
    //   // 非必填并且值为空不需要进行后续验证
    //   if (!obj[key]) {
    //     continue
    //   }
  
    //   // 验证手机号
    //   if (rules[key].phone) {
    //     if (!isMobile(obj[key])) {
    //       result.push('手机号格式不正确')
    //       continue
    //     }
    //   }
  
    //   // 验证固定电话和移动电话
    //   if (rules[key].telephone) {
    //     if (!isPhone(obj[key]) && !isMobile(obj[key])) {
    //       result.push('请输入正确的固话或手机号')
    //       continue
    //     }
    //   }
  
    //   // 验证身份证号
    //   if (rules[key].cerId) {
    //     const result = cardid(obj[key])
    //     if (result[0]) {
    //       result.push(result[0])
    //     }
    //   }
    // }
    // return result
  
    const keys = Object.keys(rules)
  
    const result = []
  
    for (const key of keys) {
      for (const item of rules[key]) {
        // 验证必填
        if (item.required) {
          if (!obj[key]) {
            result.push(item.msg)
            continue
          }
        }
  
        // 非必填并且值为空不需要进行后续验证
        if (!obj[key]) {
          continue
        }
  
        // 验证手机号
        if (item.phone) {
          if (!isMobile(obj[key])) {
            result.push(item.msg)
            continue
          }
        }
  
        // 验证固定电话和移动电话
        if (item.telephone) {
          if (!isPhone(obj[key]) && !isMobile(obj[key])) {
            result.push(item.msg)
            continue
          }
        }
  
        // 验证身份证号
        if (item.cerId) {
          const res = cardid(obj[key])
          if (res[0]) {
            result.push(item.msg)
          }
        }
      }
    }
    return result.length > 0 ? result : null
  }
  